﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinCourseControls
{
    public partial class FrmRichTextBox01 : Form
    {
        public FrmRichTextBox01()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 窗体加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmRichTextBox01_Load(object sender, EventArgs e)
        {
            richTextBox1.SelectionBullet = true;//应用项目符号 - 设置行文本前增加符号
            richTextBox1.SelectionIndent = 10;//项目符号开始位置的缩进
            richTextBox1.SelectionRightIndent = 20;//右侧的缩进
        }

        /// <summary>
        /// 选定内容发生改变时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void richTextBox1_SelectionChanged(object sender, EventArgs e)
        {
            textBox1.Text = richTextBox1.SelectedText;
        }

        /// <summary>
        /// 提供超链接行为
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
        {
            Process.Start(e.LinkText);  // 打开超链接网址
        }

        /// <summary>
        /// 将选定内容复制到剪贴板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miCopy_Click(object sender, EventArgs e)
        {
            richTextBox1.Copy();//将选定内容复制到剪贴板
        }

        /// <summary>
        /// 将选定内容移动到剪贴板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miCut_Click(object sender, EventArgs e)
        {
            richTextBox1.Cut();//将选定内容移动到剪贴板
        }

        /// <summary>
        /// 将剪贴板中的内容复制到RichTextBox中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miPaste_Click(object sender, EventArgs e)
        {
            richTextBox1.Paste();//将剪贴板中的内容复制到RichTextBox中
        }

        /// <summary>
        /// 清空
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miClear_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();//清空
        }

        /// <summary>
        /// 全选
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miSelectAll_Click(object sender, EventArgs e)
        {
            richTextBox1.SelectAll(); // 内容全选
        }

        /// <summary>
        /// 撤消上一次的操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miUndo_Click(object sender, EventArgs e)
        {
            richTextBox1.Undo();//撤消上一次的操作
        }

        /// <summary>
        ///  重做最后一次操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miRedo_Click(object sender, EventArgs e)
        {
            richTextBox1.Redo();//重做最后一次操作 - 
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miFind_Click(object sender, EventArgs e)
        {
            {   // 清空上一次查询选中的颜色
                richTextBox1.SelectAll(); // 选中全部文本
                richTextBox1.SelectionColor = SystemColors.WindowText; // 将选中文本颜色设置为系统颜色
            }

            string keywords = txtKey.Text.Trim();//要查询的关键词
            int index = 0;//文本起点
            int num = 0;//查找的个数
            while(true)
            {
                //count 表示当前查找到的位置索引  --  RichTextBoxFinds.None 表示查找所有文本实例
                int count = richTextBox1.Find(keywords, index, RichTextBoxFinds.None);//查找方法
                if(count==-1)  // count==-1 表示查找结束
                {
                    if(index==0)  // 查找以结束但是起始索引还是0 表示没找到
                    {
                        MessageBox.Show("没有找到！");
                        break;
                    }
                    else // 查找到了-并且查找结束了
                    {
                        MessageBox.Show($"查找完毕，共找到{num}个！");
                        break;
                    }
                }
                else  // 查找到了
                {
                    num += 1;   // 查找计数加1
                    index = count; // 设置查找起始位置
                    richTextBox1.Focus(); // 获取输入焦点
                    richTextBox1.Select(count, keywords.Length); // 设置查找文本选中
                    richTextBox1.SelectionColor = Color.Red;//找到的关键词设置为红色
                    index += keywords.Length;//下一次查找的起始位置 
                }
            }
        }

        /// <summary>
        /// 替换文本
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void miReplace_Click(object sender, EventArgs e)
        {
            {   // 清空上一次替换选中文本的颜色
                richTextBox1.SelectAll(); // 选中全部文本
                richTextBox1.SelectionColor = SystemColors.WindowText; // 将选中文本颜色设置为系统颜色
            }

            string keywords = txtKey.Text.Trim();//要查询的关键词
            string reText = txtReTxt.Text.Trim();//要替换文本
            int index = 0;//文本起点
            int num = 0;//查找的个数
            while (true)
            {
                //count 表示当前查找到的位置索引
                int count = richTextBox1.Find(keywords, index, RichTextBoxFinds.None);//查找方法
                if (count == -1)  // count==-1 表示查找结束
                {
                    if (index == 0)  // 查找以结束但是起始索引还是0 表示没找到
                    {
                        MessageBox.Show("没有找到！");
                        break;
                    }
                    else
                    {
                        MessageBox.Show($"替换完毕，共替换{num}个！");
                        break;
                    }
                }
                else  // 查找到了
                {
                    num += 1;   // 查找计数加1
                    index = count;  // 设置查找起始位置
                    richTextBox1.Focus();  // 获取输入焦点
                    richTextBox1.Text = richTextBox1.Text.Substring(0, index) + reText + richTextBox1.Text.Substring(index + keywords.Length);  // 替换文本
                    index += reText.Length;//下一次查找的起始位置 
                }
            }
        }
    }
}
